//----------------------------------Include-------------------------------------
#include "mcu.h"
//------------------------------------------------------------------------------

//-----------------------------------Macro--------------------------------------
#define _CLK(v)        do{ v? GPIO_SetBits(GPIOA, GPIO_PIN_4) : GPIO_ResetBits(GPIOA, GPIO_PIN_4); }while(0)
#define _OUT(v)        do{ v? GPIO_SetBits(GPIOA, GPIO_PIN_1) : GPIO_ResetBits(GPIOA, GPIO_PIN_1); }while(0)
#define _IN()          (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_6) ? 1 : 0)
#define _NOP()         do{ for(volatile uint32_t i=0; i<100; i++) mcu_nop(); }while(0)
//如果用 nop 做延时，循环变量一定要用 volatile 声明，否则被优化掉
//------------------------------------------------------------------------------

//--------------------------------Static Var------------------------------------
//------------------------------------------------------------------------------

//--------------------------------Public Func-----------------------------------
void mcu_init_spi_sw(void)
{
//pin
  RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
  
  //PA1 - MOSI    PA4 - SCLK    PA5 - CS    PA6 - MISO
  GPIO_InitType     GPIO_InitS;
  GPIO_InitStruct (&GPIO_InitS);
  
  GPIO_InitS.Pin            = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
  GPIO_InitS.GPIO_Mode      = GPIO_MODE_OUTPUT_PP;
  GPIO_InitS.GPIO_Pull      = GPIO_PULL_UP;
  GPIO_InitS.GPIO_Speed     = GPIO_SPEED_HIGH;
  GPIO_InitS.GPIO_Current   = GPIO_DC_LOW;
//GPIO_InitS.GPIO_Alternate
  GPIO_InitPeripheral(GPIOA, &GPIO_InitS);
  
  GPIO_InitS.Pin            = GPIO_PIN_6;
  GPIO_InitS.GPIO_Mode      = GPIO_MODE_INPUT;
  GPIO_InitS.GPIO_Pull      = GPIO_PULL_UP;
  GPIO_InitS.GPIO_Speed     = GPIO_SPEED_HIGH;
  GPIO_InitS.GPIO_Current   = GPIO_DC_LOW;
//GPIO_InitS.GPIO_Alternate
  GPIO_InitPeripheral(GPIOA, &GPIO_InitS);
  
  //CS
  GPIO_SetBits(GPIOA, GPIO_PIN_5);
  //SCLK
  GPIO_ResetBits(GPIOA, GPIO_PIN_4);
}

//CS
void mcu_spi_sw_cs(uint8_t level)
{
  level ? GPIO_SetBits(GPIOA, GPIO_PIN_5) : GPIO_ResetBits(GPIOA, GPIO_PIN_5);
}

//read write
//s  M    M       e
//_ _^^_ _^^_ ... _
uint8_t mcu_spi_sw_rdwr_byte(uint8_t TxData)
{ 
  uint32_t  i;
  uint8_t   res=0;
  
  _NOP();
  for(i=0; i<8; i++){
    if(TxData&0x80) _OUT(1);
    else            _OUT(0);
    TxData <<= 1;
    
    _NOP(); _CLK(1); _NOP();  //上升沿
    _NOP(); _CLK(0); _NOP();  //下降沿
    
    res <<= 1;
    if(_IN()) res |= 1;
  }
  _NOP();
  
  return res;
}
//------------------------------------EOF---------------------------------------

